/*
 * @Author: szx
 * @Date: 2022-03-16 16:28:06
 * @LastEditTime: 2022-03-16 16:38:00
 * @Description:
 * @FilePath: \learn\手撸JS源码\bind.js
 */
Function.prototype.myBind = function () {
    if (typeof this !== 'function') throw new TypeError('caller must be a function');
    // 函数为当前调用者
    const fn = this;
    // 下上文
    const context = arguments[0];
    // 传进来的参数作为新函数的参数
    const args = Array.prototype.slice.call(arguments, 1);
    const bindFunc = function () {
        //当然这个新传进来的参数放在新函数的前面还是后面我不知道
        const newArgs = args.concat(Array.from(arguments));
        // 若是普通情况，this 会指向 window，而若是使用 new ，那么 this 会指向实例
        return fn.apply(this instanceof bindFunc ? this : context, newArgs);
    };
    // bindFunc 继承原型链中的方法
    bindFunc.prototype = Object.create(fn.prototype);
    return bindFunc;
};
